package com.chat.admin.Listener;

import com.chat.admin.utils.RedisUtil;
import com.chat.common.common.constant.RedisKeyConstant;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Lazy;
import org.springframework.data.redis.connection.Message;
import org.springframework.data.redis.connection.MessageListener;
import org.springframework.stereotype.Component;

import java.nio.charset.StandardCharsets;

/**
 * 监听用户上线下线的监听器
 */
@Component
@Slf4j
public class OnlineStatusListener implements MessageListener {

//    @Autowired
//    private RedisTemplate<String, String> redisTemplate;

    @Lazy
    @Autowired
    private RedisUtil redisUtil;

//    // 使用@PostConstruct注释的方法将在所有必需的依赖项注入后调用
//    // 一旦Spring容器启动，就会立即订阅频道
//    @PostConstruct
//    public void subscribe() {
//        try {
//            // 获取Redis连接，并订阅相关的频道，频道名称转换为字节码
//            Objects.requireNonNull(redisTemplate.getConnectionFactory()).getConnection()
//                    .subscribe(this, RedisKeyConstant.LOGIN_USER.getBytes(StandardCharsets.UTF_8),
//                            RedisKeyConstant.LOGIN_EXIT_USER.getBytes(StandardCharsets.UTF_8));
//        } catch (Exception e) {
//            // 当订阅过程中发生异常时，打印错误日志
//            log.error("订阅时出现错误: ", e);
//        }
//    }

    // onMessage是MessageListener的回调方法，当监听的频道有新消息时会调用这个方法
    //TODO:没有设置过期时间，后期进行优化
    @Override
    public void onMessage(Message message, byte[] pattern) {
        // 在控制台输出"触发监听器"
        log.info("触发监听器");

        // message中的消息以字符串类型提取，并且将其中的双引号替换为空，然后赋给account
        String account = message.toString().replace("\"", "");
        log.info("触发监听器 " + account);
        // 提取消息的频道信息，并将字节码转换为utf-8编码的字符串
        String channelName = new String(message.getChannel(), StandardCharsets.UTF_8);
        // 根据获取的频道名称进行判断，如果该频道为登录用户的频道
        if (RedisKeyConstant.LOGIN_USER.equals(channelName)) {
            // 用户上线，将用户账号添加到在线用户列表中
            redisUtil.sAdd(RedisKeyConstant.ONLINE_USERS_SET_KEY, account);
            //redisTemplate.opsForSet().add(RedisKeyConstant.ONLINE_USERS_LIST_KEY, account);
        } else if (RedisKeyConstant.LOGIN_EXIT_USER.equals(channelName)) {
            // 用户下线，将用户账号从在线用户列表中移除
            redisUtil.sRemove(RedisKeyConstant.ONLINE_USERS_SET_KEY, account);
            //redisTemplate.opsForSet().remove(RedisKeyConstant.ONLINE_USERS_LIST_KEY, account);
        }
    }
}